#include <iostream>  // Подключение библиотеки для ввода-вывода

using namespace std;  // Использование пространства имен std

// Функция, возвращающая закрывающую скобку для данной открывающей скобки
char get_closed_bracket(char c) {
    if (c == '[')
    {
        return ']';
    }
    else if (c == '(')
    {
        return ')';
    }
    else if (c == '<') 
    {
        return '>';
    }
    else if (c == '{') 
    {
        return '}';
    }
    else {
        return 0;  // Если символ не является открывающей скобкой, возвращаем 0
    }
}

char stack[1000];  // Массив для реализации стека
int top = -1;  // Индекс вершины стека

// Функция для добавления элемента в стек
bool push(char x) {
    if (top >= 999) {  // Если стек полон, возвращаем false
        return false;
    } else {
        top++;
        stack[top] = x;  // Добавляем элемент в стек
        return true;
    }
}

// Функция для удаления элемента из стека
char pop() {
    if (top < 0) {  // Если стек пуст, возвращаем 0
        return 0;
    } else {
        char c = stack[top];  // Запоминаем верхний элемент стека
        top--;  // Уменьшаем индекс вершины стека
        return c;  // Возвращаем удаленный элемент
    }
}


bool isEmpty() {
    return (top < 0);
}

bool check_brackets(string s) {
    for (char c : s) {  
        if (c == '[' or c == '(' or c == '{' or c == '<') { 
            push(c); 
        } else {
            char topElement = pop();  
            
            if (topElement == 0) {  
                return false; 
            }
            
            if (get_closed_bracket(topElement) != c) {  
                return false;  
            }
        }
    }
    return isEmpty();  
}


int main() {
    string s;
    cin >> s;
    cout << (check_brackets(s) ? "True" : "False");  
    return 0;
}
